/*
 * Copyright (c) 2022 Meta
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "_common.h"

#ifdef CONFIG_POSIX_API
#include <pthread.h>
#else
#include <zephyr/posix/pthread.h>
#endif

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
/**
 * @brief existence test for `<pthread.h>`
 *
 * @see <a href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/pthread.h.html">pthread.h</a>
 */
ZTEST(posix_headers, test_pthread_h)
{
#ifdef CONFIG_POSIX_API
	zassert_not_equal(-1, PTHREAD_BARRIER_SERIAL_THREAD);

	zassert_not_equal(-1, PTHREAD_CANCEL_ASYNCHRONOUS);
	zassert_not_equal(-1, PTHREAD_CANCEL_DEFERRED);

	zassert_not_equal(-1, PTHREAD_CANCEL_ENABLE);
	zassert_not_equal(-1, PTHREAD_CANCEL_DISABLE);

	zassert_not_equal((void *)-42, PTHREAD_CANCELED);

	zassert_not_equal(-1, PTHREAD_CREATE_DETACHED);
	zassert_not_equal(-1, PTHREAD_CREATE_JOINABLE);

	zassert_not_equal(-1, PTHREAD_EXPLICIT_SCHED);
	zassert_not_equal(-1, PTHREAD_INHERIT_SCHED);

	zassert_not_equal(-1, PTHREAD_MUTEX_DEFAULT);
	zassert_not_equal(-1, PTHREAD_MUTEX_ERRORCHECK);
	zassert_not_equal(-1, PTHREAD_MUTEX_ERRORCHECK);
	zassert_not_equal(-1, PTHREAD_MUTEX_RECURSIVE);
	/* zassert_not_equal(-1, PTHREAD_MUTEX_ROBUST); */  /* not implemented */
	/* zassert_not_equal(-1, PTHREAD_MUTEX_STALLED); */ /* not implemented */

	pthread_once_t once = PTHREAD_ONCE_INIT;

	/* zassert_not_equal(-1, PTHREAD_PRIO_INHERIT); */ /* not implemented */
	zassert_not_equal(-1, PTHREAD_PRIO_NONE);
	/* zassert_not_equal(-1, PTHREAD_PRIO_PROTECT); */ /* not implemented */

	zassert_not_equal(-1, PTHREAD_PROCESS_SHARED);
	zassert_not_equal(-1, PTHREAD_PROCESS_PRIVATE);

	zassert_not_equal(-1, PTHREAD_SCOPE_PROCESS);
	zassert_not_equal(-1, PTHREAD_SCOPE_SYSTEM);

	pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
	pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
	/* pthread_rwlock_t lock = POSIX_READER_WRITER_LOCKS_INITIALIZER; */ /* not implemented */

	zassert_not_null(pthread_atfork);
	zassert_not_null(pthread_attr_destroy);
	zassert_not_null(pthread_attr_getdetachstate);
	zassert_not_null(pthread_attr_getguardsize);
	zassert_not_null(pthread_attr_getinheritsched);
	zassert_not_null(pthread_attr_getschedparam);
	zassert_not_null(pthread_attr_getschedpolicy);
	zassert_not_null(pthread_attr_getscope);
	zassert_not_null(pthread_attr_getstack);
	zassert_not_null(pthread_attr_getstacksize);
	zassert_not_null(pthread_attr_init);
	zassert_not_null(pthread_attr_setdetachstate);
	zassert_not_null(pthread_attr_setguardsize);
	zassert_not_null(pthread_attr_setinheritsched);
	zassert_not_null(pthread_attr_setschedparam);
	zassert_not_null(pthread_attr_setschedpolicy);
	zassert_not_null(pthread_attr_setscope);
	zassert_not_null(pthread_attr_setstack);
	zassert_not_null(pthread_attr_setstacksize);
	zassert_not_null(pthread_barrier_destroy);
	zassert_not_null(pthread_barrier_init);
	zassert_not_null(pthread_barrier_wait);
	zassert_not_null(pthread_barrierattr_destroy);
	/* zassert_not_null(pthread_barrierattr_getpshared); */ /* not implemented */
	zassert_not_null(pthread_barrierattr_init);
	/* zassert_not_null(pthread_barrierattr_setpshared); */ /* not implemented */
	zassert_not_null(pthread_cancel);
	zassert_not_null(pthread_cond_broadcast);
	zassert_not_null(pthread_cond_destroy);
	zassert_not_null(pthread_cond_init);
	zassert_not_null(pthread_cond_signal);
	zassert_not_null(pthread_cond_timedwait);
	zassert_not_null(pthread_cond_wait);
	zassert_not_null(pthread_condattr_destroy);
	zassert_not_null(pthread_condattr_getclock);
	/* zassert_not_null(pthread_condattr_getpshared); */ /* not implemented */
	zassert_not_null(pthread_condattr_init);
	zassert_not_null(pthread_condattr_setclock);
	/* zassert_not_null(pthread_condattr_setpshared); */ /* not implemented */
	zassert_not_null(pthread_create);
	zassert_not_null(pthread_detach);
	zassert_not_null(pthread_equal);
	zassert_not_null(pthread_exit);
	zassert_not_null(pthread_getconcurrency);
	/* zassert_not_null(pthread_getcpuclockid); */ /* not implemented */
	zassert_not_null(pthread_getschedparam);
	zassert_not_null(pthread_getspecific);
	zassert_not_null(pthread_join);
	zassert_not_null(pthread_key_create);
	zassert_not_null(pthread_key_delete);
	/* zassert_not_null(pthread_mutex_consistent); */ /* not implemented */
	zassert_not_null(pthread_mutex_destroy);
	zassert_not_null(pthread_mutex_getprioceiling);
	zassert_not_null(pthread_mutex_init);
	zassert_not_null(pthread_mutex_lock);
	zassert_not_null(pthread_mutex_setprioceiling);
	zassert_not_null(pthread_mutex_timedlock);
	zassert_not_null(pthread_mutex_trylock);
	zassert_not_null(pthread_mutex_unlock);
	zassert_not_null(pthread_mutexattr_destroy);
	zassert_not_null(pthread_mutexattr_getprioceiling);
	zassert_not_null(pthread_mutexattr_getprotocol);
	/* zassert_not_null(pthread_mutexattr_getpshared); */ /* not implemented */
	/* zassert_not_null(pthread_mutexattr_getrobust); */  /* not implemented */
	zassert_not_null(pthread_mutexattr_gettype);
	zassert_not_null(pthread_mutexattr_init);
	zassert_not_null(pthread_mutexattr_setprioceiling);
	zassert_not_null(pthread_mutexattr_setprotocol);
	/* zassert_not_null(pthread_mutexattr_setpshared); */     /* not implemented */
	/* zassert_not_null(pthread_mutexattr_setrobust); */      /* not implemented */
	zassert_not_null(pthread_mutexattr_settype);
	zassert_not_null(pthread_once);
	zassert_not_null(pthread_rwlock_destroy);
	zassert_not_null(pthread_rwlock_init);
	zassert_not_null(pthread_rwlock_rdlock);
	zassert_not_null(pthread_rwlock_timedrdlock);
	zassert_not_null(pthread_rwlock_timedwrlock);
	zassert_not_null(pthread_rwlock_tryrdlock);
	zassert_not_null(pthread_rwlock_trywrlock);
	zassert_not_null(pthread_rwlock_unlock);
	zassert_not_null(pthread_rwlock_wrlock);
	zassert_not_null(pthread_rwlockattr_destroy);
	zassert_not_null(pthread_rwlockattr_getpshared);
	zassert_not_null(pthread_rwlockattr_init);
	zassert_not_null(pthread_rwlockattr_setpshared);
	zassert_not_null(pthread_self);
	zassert_not_null(pthread_setcancelstate);
	zassert_not_null(pthread_setcanceltype);
	zassert_not_null(pthread_setconcurrency);
	zassert_not_null(pthread_setschedparam);
	zassert_not_null(pthread_setschedprio);
	zassert_not_null(pthread_setspecific);
	zassert_not_null(pthread_spin_destroy);
	zassert_not_null(pthread_spin_init);
	zassert_not_null(pthread_spin_lock);
	zassert_not_null(pthread_spin_trylock);
	zassert_not_null(pthread_spin_unlock);
	zassert_not_null(pthread_testcancel);
#endif
}
#pragma GCC diagnostic pop
